<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="nptBg" id="nptBg"><span data-lake-id="u9751eadd" id="u9751eadd">典型回答</span></h1>
  <p data-lake-id="u3274c9e9" id="u3274c9e9"><br></p>
  <p data-lake-id="u8bd87dd1" id="u8bd87dd1"><span data-lake-id="u98759d5f" id="u98759d5f">Dubbo的整体架构中，有多个角色，分别是服务提供者，服务调用者以及服务注册中心。一次完整的服务调用过程其实要分为服务注册、服务发现和服务调用三个过程。</span></p>
  <p data-lake-id="u19e51178" id="u19e51178"><span data-lake-id="ufafe2869" id="ufafe2869">​</span><br></p>
  <p data-lake-id="u7554fa1f" id="u7554fa1f"><span data-lake-id="u2d4f7a8d" id="u2d4f7a8d">​</span><br></p>
  <p data-lake-id="ud78a1ce6" id="ud78a1ce6"><br></p>
  <p data-lake-id="u31b584c5" id="u31b584c5"><img src="https://cdn.nlark.com/yuque/0/2023/png/5378072/1680876975737-834e5838-87be-4e86-a742-4ba1af792819.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_32%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uddfd14e4" id="uddfd14e4"><br></p>
  <p data-lake-id="u7ecaa8f2" id="u7ecaa8f2"><br></p>
  <p data-lake-id="u0b53bdf8" id="u0b53bdf8"><strong><span data-lake-id="u3b6b8b5f" id="u3b6b8b5f">1、服务注册</span></strong><span data-lake-id="ude5f6025" id="ude5f6025">：服务提供者在启动时，会向注册中心注册自己提供的服务，并将服务相关的信息（如服务名称、版本号、IP地址、端口号、协议、权重等）一并注册。Dubbo支持多种注册中心，包括ZooKeeper、Redis、Multicast、Simple等。一旦服务注册成功，服务提供者就可以等待服务调用请求的到来。</span></p>
  <p data-lake-id="u2178f51e" id="u2178f51e"><span data-lake-id="ucb836576" id="ucb836576">​</span><br></p>
  <p data-lake-id="uf1bf0e56" id="uf1bf0e56"><strong><span data-lake-id="ufc87f4c7" id="ufc87f4c7">2、服务发现</span></strong><span data-lake-id="u5542a882" id="u5542a882">：服务调用者在启动时，需要向注册中心订阅自己所需的服务，注册中心会将服务提供者列表返回给服务调用者。当过程中，如果服务提供者列表发生变化，那么Dubbo会通知客户端进行变更。</span></p>
  <p data-lake-id="u063bf3f7" id="u063bf3f7"><span data-lake-id="u6115298d" id="u6115298d">​</span><br></p>
  <p data-lake-id="ubcce6626" id="ubcce6626"><strong><span data-lake-id="u08b17c13" id="u08b17c13">3、服务调用</span></strong><span data-lake-id="ua9eb09b4" id="ua9eb09b4">：服务调用者需要根据负载均衡策略选择一个服务提供者，之后，就可以发送服务调用请求了。Dubbo支持多种通信协议和序列化方式。Dubbo客户端将调用请求序列化成二进制数据，并使用网络协议发送给服务提供者，服务提供者将调用请求反序列化后，调用目标方法并将结果序列化成二进制数据返回给服务调用者。在整个调用过程中</span></p>
  <p data-lake-id="u0de1ba19" id="u0de1ba19"><span data-lake-id="u238020a1" id="u238020a1">​</span><br></p>
  <p data-lake-id="u4ba9561c" id="u4ba9561c"><span data-lake-id="u8ef285a2" id="u8ef285a2">Dubbo会对服务调用进行监控，包括调用次数、调用时间、响应时间、异常次数、异常信息等，以便于服务提供者和服务调用者进行故障排查和性能调优。</span></p>
  <p data-lake-id="ub05b968c" id="ub05b968c"><br></p>
  <h1 data-lake-id="jdOIq" id="jdOIq"><span data-lake-id="ub5f14fae" id="ub5f14fae">扩展知识</span></h1>
  <p data-lake-id="uc7928272" id="uc7928272"><br></p>
  <h2 data-lake-id="B13L7" id="B13L7"><span data-lake-id="ud99ece0a" id="ud99ece0a">连接方式</span></h2>
  <p data-lake-id="u8a4f2eea" id="u8a4f2eea"><br></p>
  <p data-lake-id="ude8b3728" id="ude8b3728"><strong><span data-lake-id="u1a381970" id="u1a381970">Dubbo提供了多种通信协议和通信方式</span></strong><span data-lake-id="u01d69142" id="u01d69142">，包括dubbo、http、hessian等，对于不同的通信方式，Dubbo也提供了不同的通信模型。对于服务提供者和服务消费者之间的通信，</span><strong><span data-lake-id="u6df846bc" id="u6df846bc">可以使用长连接模式或短连接模式</span></strong><span data-lake-id="ud69c846a" id="ud69c846a">，可以使用NIO或者Netty等高性能的通信框架，</span><strong><span data-lake-id="ua312b0dc" id="ua312b0dc">还可以设置心跳等机制来保持连接的稳定性。</span></strong></p>
  <p data-lake-id="uf51c7b60" id="uf51c7b60"><span data-lake-id="u632e7aa1" id="u632e7aa1">​</span><br></p>
  <p data-lake-id="uefe809a9" id="uefe809a9"><span data-lake-id="u57c40c1b" id="u57c40c1b">对于服务提供者和注册中心之间的通信，Dubbo同样提供了多种注册中心实现，包括ZooKeeper、Redis、Multicast和Simple等，这些注册中心实现了不同的通信协议和通信方式。</span></p>
  <p data-lake-id="u45a7ae36" id="u45a7ae36"><span data-lake-id="uabc4588c" id="uabc4588c">​</span><br></p>
  <p data-lake-id="u3d39f53c" id="u3d39f53c"><span data-lake-id="u7e5234c2" id="u7e5234c2">在使用ZooKeeper作为注册中心时，Dubbo会通过ZooKeeper的长连接来注册服务和订阅服务提供者列表，并通过ZooKeeper提供的watch机制来监听服务提供者列表的变化。而在使用Redis作为注册中心时，则会使用Redis提供的订阅-发布机制来进行服务注册和发现。</span></p>
  <p data-lake-id="u8456e896" id="u8456e896"><br></p>
 </body>
</html>